๐Ÿ’ช๐Ÿฝ๐Ÿ’ช๐ŸฝํŒŒ์ด๋„ ํ”„๋กœ์ ํŠธ 1์ฃผ์ฐจ ๋ฆฌํŒฉํ† ๋ง ๊ณผ์ •

๐Ÿคฎ๋ถ€ํŠธ์บ ํ”„ ์กธ์—… ์ดํ›„๊ฐ€ ์ง„์งœ ์‹œ์ž‘์ด๋ผ๋Š”..

์ง€๋‚œ์ฃผ ๊ธˆ์š”์ผ์— ์›น ๊ฐœ๋ฐœ ๋ถ€ํŠธ์บ ํ”„ ๊ณผ์ •์„ ์ˆ˜๋ฃŒํ–ˆ๋‹ค.

๊ทธ๋ ‡๊ฒŒ ์ฃผ๋ง์„ ๋ณด๋‚ด๊ณ  ์›”์š”์ผ์ด ๋˜์—ˆ๊ณ  ์ง€๊ธˆ์€ ๊ธˆ์š”์ผ ์ €๋…์ด๋‹ค.

ํŒŒ์ด๋„ ํ”„๋กœ์ ํŠธ๋ฅผ ์กฐ๊ธˆ ๋” ๋ฉ‹์ง€๊ฒŒ ๊ฐ€๊พธ์–ด ๋‚˜๊ฐ€๋Š” ์ค‘์ด๋‹ค. ๋ฌผ๋ก  ์˜๋„ํ•œ ๋ฐ”๋Œ€๋กœ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ ์กฐ๊ธˆ ๋” ๋…ธ๋ ฅ์„ ๋“ค์—ฌ์•ผ ํ•œ๋‹ค.

ํŒ€์›๋“ค๊ณผ ํ”„๋กœ์ ํŠธ๋ฅผ ๋‹ค๋“ฌ์€ ๊ฒฝํ—˜์„ ์ด์•ผ๊ธฐ ํ•˜๊ธฐ ์ „์— ์„ ํƒ๊ณผ ์ง‘์ค‘์„ ๋” ์ž˜ํ•ด์•ผ ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ ๋‹ค.

์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋„ ์—ฐ์Šตํ•ด์•ผ ํ•˜๊ณ , ๊ธฐ์ดˆ์ ์ธ CS ์ง€์‹์— ๋Œ€ํ•œ ํ•™์Šต๊ณผ ๊ทธ๋™์•ˆ ์“ด ๋ธ”๋กœ๊ทธ ๊ธ€์„ ํ†ตํ•œ ๋ณต์Šต๋„ ํ•„์š”ํ•˜๋‹ค.

์š•์‹ฌ์ด ๋งŽ์•„์„œ ๋ง‰ ์—ฌ๊ธฐ ์ €๊ธฐ ํŽผ์ณ ๋‘๊ณ  ํ•œ ๋ฒˆ์— ๋‹ค ๋จน์œผ๋ ค๊ณ  ํ–ˆ๋˜ ์ ์„ ๋ฐ˜์„ฑํ•œ๋‹ค.

๋ถ€ํŠธ์บ ํ”„์—์„œ ๊ฐ์ž๊ฐ€ ๋ชจ๋‘ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๋ ค๋Š” ์‚ฌ์—ฐ๋“ค์ด ์žˆ์—ˆ๋‹ค. ๋‚˜๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋‹ค. ๋‚œ ํ•ด๋‚ผ ๊ฑฐ๊ณ  ๋ฟŒ๋ฆฌ๋ฅผ ๋‚ด๋ ค์„œ ๋‹ค์‹œ ๊ฝƒํ”ผ์›Œ ๋‚˜๊ฐˆ ๊ฒƒ์ด๋‹ค.

๐Ÿ‘จ๐Ÿปโ€๐ŸŽจ๋žœ๋”ฉํŽ˜์ด์ง€ UI ๊ฐœ์„ 

gif ๋ฅผ ํ†ตํ•ด ์„œ๋น„์Šค๋ฅผ ์‹œ์—ฐํ•˜๋Š” ๋ชจ์Šต๊ณผ ๋”๋ถˆ์–ด ์˜†์— ์„ค๋ช…๊ธ€์ด ์žˆ๋Š”๋ฐ, ํŒ€์›๋“ค์ด ์ข‹์€ ์˜๊ฒฌ์„ ๋‚ด์ฃผ์…”์„œ ํฐํŠธ์™€ ํฌ๊ธฐ๋ฅผ ์ข€๋” ๋ˆˆ์— ๋“ค์–ด์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ๋ณ€๊ฒฝํ•ด ์ฃผ์—ˆ๋‹ค.

๋˜ํ•œ footer ๋ถ€๋ถ„์ด ๋„ˆ๋ฌด ์™ผ์ชฝ์œผ๋กœ ์น˜์šฐ์ณ์ง„ ๋“ฏ ํ•˜์—ฌ ๊ทธ ๋ถ€๋ถ„๋„ ๊ฐ€์šด๋ฐ๋กœ ์ •๋ ฌ์ด ๋˜๋„๋ก ์ˆ˜์ •ํ•˜์˜€๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋กœ๊ณ ์™€ Github ๋งํฌ๋ฅผ ํด๋ฆญํ•˜๋ฉด ๊ฐ๊ฐ ํŒŒ์ด๋„ ํ”„๋กœ์ ํŠธ ๊ธฐํš์„œ (๋…ธ์…˜) ์™€ Github Repo ์˜ Wiki ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ์ฃผ์—ˆ๋‹ค.

ํŒ€์›๋ถ„๋“ค์ด ์กฐ๊ธˆ ๋” ์ „๋ฌธ์ ์ธ ๋Š๋‚Œ์„ ์ฃผ๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ „์ฒด์ ์œผ๋กœ ๊ฝ‰ ์ฐฌ UI ์˜ ๋Š๋‚Œ๋ณด๋‹ค๋Š”, ๋„ค์ด๋ฒ„ ํฌํ„ธ ํ™”๋ฉด์ฒ˜๋Ÿผ ์ขŒ์šฐ ์—ฌ๋ฐฑ์ด ์žˆ๊ฒŒ UI ๋ฅผ ๊ฐœ์„ ํ•ด ๋ณด๋ฉด ์–ด๋–จ๊นŒ ์ œ์•ˆ์„ ํ•ด์ฃผ์…”์„œ ๊ทธ ์ ๋„ ๋ฐ˜์˜ํ–ˆ๋‹ค.

์ด ๋ถ€๋ถ„์€ ๋‹ค๋ฅธ ํŽ˜์ด์ง€์—๋„ ๋™์ผํ•˜๊ฒŒ ์—ฌ๋ฐฑ์„ ์ฃผ์–ด ์ ์šฉํ–ˆ๋‹ค.

๐Ÿ‘จ๐Ÿปโ€๐ŸŽจ๋งˆ์ดํŽ˜์ด์ง€ UI ๊ฐœ์„ 

์ด์ „์—๋Š” ์ด๋ชจ์ง€์˜ ๋‚จ๋ฐœ์ด ์ข€ ์žˆ์—ˆ๋˜ ๊ฑฐ ๊ฐ™์•„ ์ตœ์†Œํ•œ์˜ ์ด๋ชจ์ง€๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ๋ชจ๋‘ ์ง€์› ๋‹ค.

๋จผ์ € ์ˆ˜์ • ์ „์˜ ๋งˆ์ดํŽ˜์ด์ง€์˜ ์‚ฌ์šฉ์ž ์ •๋ณด UI ๋ฅผ ๋ณด์ž.

mypage before

alt ์†์„ฑ์ด๋‚˜ ๊นจ์ง„ ๋“ฏํ•ด ๋ณด์ด๋Š” ์‚ฌ์šฉ์ž ์•„๋ฐ”ํƒ€ ๋ฐ•์Šค๊ฐ€ ๋ฌด์–ธ๊ฐ€ ๋ฏธ์™„์„ฑ์˜ ๋Š๋‚Œ์„ ํ’๊ธฐ๋Š” ๊ฒƒ ๊ฐ™์•˜๋‹ค.

๊ทธ๋ž˜์„œ ์ตœ์ดˆ ํšŒ์›๊ฐ€์ž…ํ•œ ์‚ฌ์šฉ์ž์™€ ๊ฒŒ์ŠคํŠธ ๋กœ๊ทธ์ธ์„ ํ•œ ์‚ฌ์šฉ์ž์˜ ๊ธฐ๋ณธ ์•„๋ฐ”ํƒ€ ์ด๋ฏธ์ง€๋ฅผ ์ ์šฉํ•ด ์ฃผ์—ˆ๊ณ  ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ƒ‰์ƒ์„ ๋‹คํ™์ƒ‰์œผ๋กœ ์ค€ ๊ฒƒ์„ ์ง€์šฐ๊ณ  ํ•ด๋‹น ๊ธฐ๋ณธ ์•„๋ฐ”ํƒ€์™€ ๋น„์Šทํ•œ ์ƒ‰์ƒ์„ ์ ์šฉํ•ด ์ฃผ์—ˆ๋‹ค.

์ด๋ฏธ์ง€ ์„ ํƒ๊ณผ ์ด๋ฏธ์ง€ ๋ณ€๊ฒฝ ๋ฒ„ํŠผ์˜ ์œ„์น˜๋„ ์ˆ˜์ •ํ•ด ์ฃผ์—ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ •๋ณด์— ๋Œ€ํ•ด์„œ๋„ ์กฐ๊ธˆ ๋” ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ •๋ ฌ์„ ํ•ด์„œ ํ†ต์ผ์„ฑ ์žˆ๊ฒŒ ๋ณด์ด๊ฒŒ ํ•˜์˜€๋‹ค.

mypage after

๊ธฐ๋ณธ ๋ฐฐ๊ฒฝ๋„ ๊ธฐ์กด์˜ ํšŒ์ƒ‰ ๋ณด๋‹ค๋Š” ํ•œ๊ฐ•์ด ๋ณด์ด๋Š” ๋ทฐ๋ฅผ ๊ฐ€์ง„ ์ด๋ฏธ์ง€๋กœ ์ ์šฉํ•ด์ฃผ๋‹ˆ ๋Š๋‚Œ์ด ํ›จ์”ฌ ์‚ด์•„๋‚˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์ˆ˜์ •ํ•˜๋„๋ก ํ•˜๋Š” ๋ชจ๋‹ฌ์ฐฝ์˜ UI ๋„ ๊ธฐ์กด์— ์˜์–ด๋ฅผ ๋„ˆ๋ฌด ๋‚จ๋ฐœํ•˜๊ณ  ๋””์ž์ธ์ด ๋ณ„๋กœ์ธ ๋“ฏ ํ•˜์—ฌ ์ด ๋ถ€๋ถ„๋„ ์ˆ˜์ •ํ–ˆ๋‹ค.

mypage popup

๊ทธ๋ฆฌ๊ณ  ์•„๋ž˜๋ฅผ ๋‚ด๋ฆฌ๋ฉด ์Šค์ผ€์ค„ ์นด๋“œ๊ฐ€ ์žˆ๋Š”๋ฐ ๊ธฐ์กด ํ’€ ํ™”๋ฉด์‹œ ๊ฝ‰์ฐฌ ๋Š๋‚Œ์—์„œ ๋žœ๋”ฉํŽ˜์ด์ง€ ์ฒ˜๋Ÿผ ์ขŒ์šฐ ์—ฌ๋ฐฑ์„ ์ถฉ๋ถ„ํžˆ ์ฃผ์—ˆ๋‹ค.

๐Ÿ‘จ๐Ÿปโ€๐ŸŽจ์Šค์ผ€์ค„๋Ÿฌ ํŽ˜์ด์ง€ UI ๊ฐœ์„  ๋ฐ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

์œ„์˜ gif ๊ฐ€ ์ˆ˜์š”์ผ์— ์ˆ˜์ •ํ•œ ๋ถ€๋ถ„์ด์˜€๋‹ค.

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ขŒ์šฐ ์—ฌ๋ฐฑ์„ ์ฃผ์—ˆ๊ณ  ์ˆ˜์ •ํ–ˆ์„ ์ง€๋ผ๋„ ๋ฐ˜์‘ํ˜•์—๋Š” ์ „ํ˜€ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์—์„œ ๋” ๋‚˜์•„๊ฐ„ ๋ถ€๋ถ„์„ ์†Œ๊ฐœํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

์Šค์ผ€์ค„๋Ÿฌ ํŽ˜์ด์ง€๋ฅผ ๊ฐœ์„ ํ•˜๋ฉด์„œ ์žฌ๋ฏธ๋ฅผ ๋งŽ์ด ๋Š๊ผˆ์ง€๋งŒ ์•ž์œผ๋กœ ์ง„ํ–‰ํ•  ๋ถ€๋ถ„์—์„œ ๋ง‰ํžŒ ๋ถ€๋ถ„๋„ ์žˆ์–ด์„œ ๊ฐ™์ด ํ’€์–ด๋ณด๊ฒ ๋‹ค.

1. ์Šค์ผ€์ค„๋Ÿฌ์˜ ์ œ๋ชฉ ๋‚ด์šฉ์„ ์ง์ ‘ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋กœ์ง ์ž‘์„ฑ

์›๋ž˜๋Š” ์Šค์ผ€์ค„๋Ÿฌ ๋ฉ”์ธ ๋ถ€๋ถ„ ์ขŒ์ธก ์— ์žˆ๋˜ Edit ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ๋ชจ๋‹ฌ์ฐฝ์„ ์—ด๊ณ  ๊ฑฐ๊ธฐ์„œ ์Šค์ผ€์ค„๋Ÿฌ์˜ ๋‚ด์šฉ์„ ๋„ฃ๊ณ  ์ˆ˜์ •ํ•˜๋ ค ํ–ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์œ ์ € ์ž…์žฅ์—์„œ ๋„ˆ๋ฌด ๋งŽ์ด ๊ฑฐ์น˜๊ฒŒ ๋˜๊ณ  ๋ฒ„ํŠผ์„ ๋งŽ์ด ๋ˆ„๋ฅด๊ฒŒ ๋งŒ๋“œ๋Š” ๋‹จ์ ์ด ์žˆ์—ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๊ณ ๋ คํ•ด์„œ๋ผ๋„ ์Šค์ผ€์ค„๋Ÿฌ์˜ ์ œ๋ชฉ ๋ถ€๋ถ„์„ ํด๋ฆญํ•˜๋ฉด ์ˆ˜์ •์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋ฉฐ, ์ œ๋ชฉ ๋ฐ”๊นฅ ๋ถ€๋ถ„์„ ํด๋ฆญํ•˜๋ฉด ๋‹ค์‹œ ํŽธ์ง‘๊ธฐ๋Šฅ์ด disabled ๋˜๊ฒŒ๋” ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•ด์•ผ ํ–ˆ๋‹ค.

ํŒ€์›๋ถ„์ด ๋ณด๋‚ด์ฃผ์‹  ๋ธ”๋กœ๊ทธ ๋‚ด์šฉ๊ณผ ๋‚ด๊ฐ€ ์ฐพ์•„๋ณธ ๋‚ด์šฉ๋“ค์„ ์ทจํ•ฉํ•ด์„œ ์ƒˆ๋กญ๊ฒŒ ๋กœ์ง์„ ๋‹ค์‹œ ์ž‘์„ฑํ–ˆ๊ณ  ํŒ€์›๋“ค์—๊ฒŒ ์„ฑ๊ณตํ–ˆ์Œ์„ ์•Œ๋ฆฌ๋Š” gif ๋ฅผ ๋ณด๋ƒˆ๋‹ค!

1-2. 1๋ฒˆ์˜ ์ฝ”๋“œ์™€ ๋ฆฌ๋ทฐ

import React, { useState, useEffect, useRef } from 'react'
import ModifyThumbs from './popupModal/ModifyThumbs'

const SchedulerMain = () => {
  const initial = `๋ฏธ์Š๋žญ 2์Šคํƒ€๐ŸŒŸ๐ŸŒŸ ์ •์‹๋‹น์—์„œ ์šด์˜ํ•˜๋Š” ์ •์‹๋ฐ”, ์—ฐ์ธ๊ณผ ํ˜น์€ ์นœ๊ตฌ์™€ ๋ถ„์œ„๊ธฐ๋ฅผ ๋‚ด๋ฉด ์ข‹์€ ๊ณณ์ด๋‹ค! ํ•˜์ง€๋งŒ ํ˜ผ์ž ๊ฐ€๋„ ๊ทธ ๋ถ„์œ„๊ธฐ๋ฅผ 120% ๋Š๋‚„ ์ˆ˜ ์žˆ๋‹ค!๐Ÿšจ๐Ÿšจ ์น˜์ฆˆ์—๐Ÿง€๐Ÿง€ ๋ ˆ๋“œ์™€์ธ๐Ÿท๐Ÿท ๊ฐํŠ€๐ŸŸ ๋ฉด ๋ชจ๋“ ๊ฒŒ ๋๋‚œ๋‹ค!`
  const ref = useRef(null)

  const [likeCount, setLikeCount] = useState(0)
  const [dislikeCount, setDislikeCount] = useState(0)

  const [isBookmarked, setIsBookmarked] = useState(false)

  const increaseLikeCount = () => {
    setLikeCount(likeCount + 1)
  }
  const increaseDislikeCount = () => {
    setDislikeCount(dislikeCount + 1)
  }

  const handleBookmark = () => {
    setIsBookmarked(!isBookmarked)
  }

  const thumbnailRef = useRef(null)
  const [text, setText] = useState(initial)
  const [editable, setEditable] = useState(false)

  const editOn = () => {
    setEditable(true)
  }
  const handleChange = e => {
    setText(e.target.value)
  }
  const handleKeyDown = e => {
    if (e.key === 'Enter') {
      setEditable(!editable)
    }
  }

  const handleRemoveTitle = () => {
    setText('')
  }

  const handleClickOutside = e => {
    if (editable === true && !ref.current.contains(e.target)) {
      setEditable(false)
    }
  }
  useEffect(() => {
    window.addEventListener('click', handleClickOutside, true)
  })

  return (
    <section className="schedule-banner">
      <div className="schedule-info">
        <div className="schedule-avatar">
          <img src={'/images/user.png'} alt="avatar" />
        </div>
        <div ref={ref} className="schedule-title">
          {editable ? (
            <textarea
              type="text"
              value={text}
              onChange={e => handleChange(e)}
              onKeyDown={handleKeyDown}
              rows="3"
              placeholder="์Šค์ผ€์ค„์— ๋งž๋Š” ์ œ๋ชฉ์„ ์ž…๋ ฅํ•ด ๋ณด์„ธ์š”!"
            />
          ) : (
            <h2 onClick={() => editOn()}>{text}</h2>
          )}
          <div className="thumbs">
            <i className="fas fa-thumbs-up" onClick={increaseLikeCount}>
              ์ข‹์•„์š”<span>{likeCount}</span>
            </i>
            <i className="fas fa-thumbs-down" onClick={increaseDislikeCount}>
              ๋ณ„๋กœ์—์š”<span>{dislikeCount}</span>
            </i>
            <i className="fas fa-eraser" onClick={handleRemoveTitle}>
              ์ง€์šฐ๊ฐœ
            </i>
          </div>
        </div>
      </div>
      <ModifyThumbs thumbnailRef={thumbnailRef} />
      <div className="shortcut-icons">
        <div className="add-thumbnail">
          <i
            id="open"
            className="fas fa-images"
            onClick={() => {
              if (thumbnailRef.current !== null) {
                thumbnailRef.current.classList.toggle('show')
              }
            }}
          ></i>
        </div>
        <div className="bookmark-share">
          {!isBookmarked ? (
            <i className="far fa-star" onClick={handleBookmark}></i>
          ) : (
            <i
              className="fas fa-star"
              onClick={handleBookmark}
              style={{ color: '#ff514f' }}
            ></i>
          )}

          <i className="far fa-share-square"></i>
        </div>
      </div>
    </section>
  )
}

export default SchedulerMain

editable ์ด๋ผ๋Š” ์ƒํƒœ์— ๋”ฐ๋ผ์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ…์ŠคํŠธ๋กœ ๋ณด์ด๊ฒŒ ๋˜๋Š”๊ฐ€ ์•„๋‹ˆ๋ฉด textarea ๊ฐ€ ์žˆ๋Š” ๋ฐ•์Šค๊ฐ€ ํ‘œ์‹œ ๋˜๋Š”๊ฐ€ ๋กœ ๋‚˜๋‰˜๊ฒŒ ๋œ๋‹ค.

์‚ผํ•ญ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋“ฏํ•œ ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง์„ ํ†ตํ•ด editable ์ด true ์ด๋ฉด textarea ๋ฅผ ๋ณด์—ฌ์ฃผ์–ด ์ˆ˜์ •์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ณ , false ์ด๋ฉด ์ผ๋ฐ˜ text ๋กœ์จ ๋ณด์—ฌ์ง€๋„๋ก ํ•œ๋‹ค.

ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์•„๋‹Œ ๋ถ€๋ถ„์„ ํด๋ฆญํ–ˆ์„ ๋•Œ editable ์ด false ๊ฐ€ ๋˜๋„๋ก useRef ์™€ useEffect ๋ฅผ ์‚ฌ์šฉํ•ด ์ฃผ์–ด ํด๋ฆญ ๋ฐœ์ƒ์‹œ โ€˜handleClickOutsideโ€™ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ํ•˜์˜€๋‹ค.

๋ฆฌ์•กํŠธ์—์„œ๋Š” DOM ์š”์†Œ๋ฅผ ์ง์ ‘ ์„ ํƒํ•˜๋ฉด ์˜ค๋ฅ˜๋ฅผ ์ผ์œผํ‚ค๊ธฐ ๋•Œ๋ฌธ์— useRef ๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•˜๊ณ ์ž ํ•˜๋Š” ์š”์†Œ์— ref ๋ฅผ ๊ฑธ์–ด์„œ ์ „๋‹ฌํ•˜๋ฉด ref.current ๋กœ ํ•ด๋‹น ์š”์†Œ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.

ref.current ์—๋Š” ํ˜„์žฌ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด๊ฐ€ ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๊ณ , ํ˜„์žฌ ๊ฐ์ฒด๊ฐ€ ์ง€๊ธˆ ํด๋ฆญํ•œ e.target ์„ ํฌํ•จํ•˜๊ณ  ์žˆ์ง€ ์•Š์œผ๋ฉด editable ์„ false ๋กœ ๋ฐ”๊พธ์–ด (ํด๋ฆญํ•œ ๊ฒƒ์ด ์Šค์ผ€์ค„๋Ÿฌ ํƒ€์ดํ‹€์ด ์•„๋‹ˆ๋ผ๋ฉด) edit ๋ชจ๋“œ๊ฐ€ ๊บผ์ง€๊ณ  ์ผ๋ฐ˜ ํ…์ŠคํŠธ๋กœ ๋ฐ”๋€Œ๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

2. ์Šค์ผ€์ค„๋Ÿฌ ์ธ๋„ค์ผ ์—…๋กœ๋“œ ๋ชจ๋‹ฌ์ฐฝ

thumbnail modal

์ด๋ฏธ์ง€ ์•„์ด์ฝ˜์„ ๋ˆŒ๋Ÿฌ ์Šค์ผ€์ค„๋Ÿฌ ํŽ˜์ด์ง€์˜ ์ธ๋„ค์ผ์„ ์—…๋กœ๋“œ ํ•˜๋Š” ๋ชจ๋‹ฌ Pop-up ์ฐฝ์„ ๋งŒ๋“ค์—ˆ๋‹ค.

3. ์ข‹์•„์š”, ์‹ซ์–ด์š” ๊ทธ๋ฆฌ๊ณ  ๋ถ๋งˆํฌ

ํ•ด๋‹น ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ ์ข‹์•„์š” ํ˜น์€ ์‹ซ์–ด์š”๋Š” ๋ฌด์ œํ•œ์œผ๋กœ ๋ˆ„๋ฅผ ์ˆ˜ ์—†๋Š”๋ฐ ์ด ๋ถ€๋ถ„์€ ๋‹ค์‹œ ๊ฐœ์„ ์ด ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ถ๋งˆํฌ ์—ฌ๋ถ€๋ฅผ ํ†ตํ•ด ์•„์ด์ฝ˜์ด ๋ฐ”๋€Œ๊ฒŒ ํ•˜์˜€๋‹ค.

4. ํ•ด์‹œํƒœ๊ทธ ์ปค์Šคํ…€ ๊ธฐ๋Šฅ

์•„๋ž˜ gif ์—์„œ ์•Œ๋ก๋‹ฌ๋กํ•œ ๋„ค ๊ฐœ์˜ ํ•ด์‹œ ํƒœ๊ทธ ์š”์†Œ๋“ค์ด ๋ณด์ด๋Š”๊ฐ€?

๊ธฐ์กด์˜ ์•„์ด๋””์–ด๋Š” ๋ชจ๋‹ฌ์ฐฝ์—์„œ ํ•ด์‹œํƒœ๊ทธ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์Šค์ผ€์ค„๋Ÿฌ ํŽ˜์ด์ง€์—์„œ ๋ณด์—ฌ์ฃผ๊ธฐ๋กœ๋งŒ ํƒœ๊ทธ๋ฅผ ๋‚˜์—ดํ•˜๊ฒŒ ํ•˜๋ ค๋Š” ์˜๋„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ด ๋˜ํ•œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ƒ ๋ถˆํŽธํ•œ ๋ฐฉ์‹์ด๋ฉด์„œ ์ž์œ ๋กญ๊ฒŒ ๋ณ€๊ฒฝํ•˜์ง€ ๋ชปํ•œ๋‹ค๋Š” ๋Š๋‚Œ์ด ๋“ค์—ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ๊ฐ€ ์ ์  ๊ฐœ์„ ๋˜์–ด ๊ฐ„๋‹ค!

5. ํ”„๋ก ํŠธ ํŒ€์›์˜ ๋ฐœ์ „, ๊ฐœ์„ 

ํ”„๋ก ํŠธ์—”๋“œ ํŒ€์› ๋ถ„๊ป˜์„œ ๋žœ๋”ฉ ํŽ˜์ด์ง€์˜ Input ์„ ํ†ตํ•ด ๊ฒ€์ƒ‰์„ ํ•˜๋ฉด ์„œ์น˜ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๋Š” ๋ถ€๋ถ„์— ๋Œ€ํ•œ UI ์™€ ์ฝ”๋“œ ๊ฐœ์„ ์„ ํ•ด์ฃผ์…จ๋‹ค.

ํŒ€์› ๋ถ„๋“ค์˜ ์‘์›๊ณผ ์กฐ์–ธ ๊ทธ๋ฆฌ๊ณ  ๋ณธ์ธ์˜ ๋…ธ๋ ฅ์œผ๋กœ ์ „๋ณด๋‹ค ๋” ๊ฐœ์„ ๋˜๊ณ  ๋ฐœ์ „๋œ UI ๋ฅผ ๋ณด์—ฌ ์ฃผ์…”์„œ ๊ธฐ๋ถ„์ด ์ข‹์•˜๋‹ค.

์ด๋ฅผ ๊ณ„๊ธฐ๋กœ ์กฐ๊ธˆ ๋” ์ž์‹ ๊ฐ์„ ์ฐพ์•„์„œ ์žฌ๋ฐŒ๊ฒŒ ๋งŒ๋“ค์–ด ๋‚˜๊ฐ€๋Š” ์žฌ๋ฏธ๋ฅผ ํ•จ๊ป˜ ๋Š๊ผˆ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค.

๐Ÿ‘จ๐Ÿปโ€๐ŸŽจ๋‹ค์Œ์€?

์‹ค์ œ ์ˆ˜์ •๊ณผ ์ €์žฅ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ๋ฐฑ์—”๋“œ์™€ ์š”์ฒญ ์‘๋‹ต์„ ์ฃผ๊ณ ๋ฐ›์•„์•ผ ํ•œ๋‹ค!

๊ทธ๋ฆฌ๊ณ  Redux ์ฝ”๋“œ์— ๋Œ€ํ•œ ์ดํ•ด๋„๋ฅผ ๋” ๋†’์—ฌ๊ฐ€๋Š” ๊ฒƒ์ด๋‹ค.

ํ™”์ดํŒ…! ๋‚œ ํ•  ์ˆ˜ ์žˆ์–ด! ๐Ÿ˜๐Ÿ˜๐Ÿ˜๐Ÿ˜๐Ÿ˜๐Ÿ˜๐Ÿ˜๐Ÿ˜๐Ÿ˜๐Ÿ˜


Written by@[DotoriMook]
ํ”„๋ก ํŠธ์—”๋“œ ์ฃผ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž ๋„ํ† ๋ฆฌ๋ฌต์˜ ๊ธฐ์ˆ ๊ฐœ๋ฐœ ๋ธ”๋กœ๊ทธ ์ž…๋‹ˆ๋‹ค.

GitHubMediumTwitterFacebook